package com.phiture.erp.basic.core.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.phiture.erp.basic.core.pojo.dto.ErpMaterialPlanPageReqDTO;
import com.phiture.erp.basic.core.pojo.dto.ErpMaterialPlanSaveReqDTO;
import com.phiture.erp.basic.core.pojo.vo.ErpMaterialPlanRespVO;
import com.phiture.erp.basic.core.service.ErpMaterialPlanService;
import com.phiture.erp.basic.dal.entity.ErpMaterialPlanDO;
import com.phiture.erp.basic.dal.mapper.ErpMaterialPlanMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.phiture.erp.common.constants.ErrorCodeConstants.MATERIAL_PLAN_NOT_EXISTS;

/**
 * 物料计划资料 Service 实现类
 *
 * @author 芋道源码
 */
@Service
public class ErpMaterialPlanServiceImpl implements ErpMaterialPlanService {

    @Resource
    private ErpMaterialPlanMapper materialPlanMapper;

//    @Resource
//    private DictDataService dictDataService;

    @Override
    public Long createMaterialPlan(ErpMaterialPlanSaveReqDTO createReqDTO) {
        // 插入
        ErpMaterialPlanDO materialPlan = BeanUtils.toBean(createReqDTO, ErpMaterialPlanDO.class);
        materialPlanMapper.insert(materialPlan);
        // 返回
        return materialPlan.getId();
    }

    @Override
    public void updateMaterialPlan(ErpMaterialPlanSaveReqDTO updateReqDTO) {
        // 校验存在
        validateMaterialPlanExists(updateReqDTO.getId());
        // 更新
        ErpMaterialPlanDO updateObj = BeanUtils.toBean(updateReqDTO, ErpMaterialPlanDO.class);
        materialPlanMapper.updateById(updateObj);
    }

    @Override
    public void createOrUpdateMaterialPlan(ErpMaterialPlanSaveReqDTO reqDTO) {
        boolean exists = materialPlanMapper.exists(
                Wrappers.lambdaQuery(ErpMaterialPlanDO.class)
                        .eq(ErpMaterialPlanDO::getMaterialId, reqDTO.getMaterialId())
                        .eq(ErpMaterialPlanDO::getDeleted, Boolean.FALSE)
        );
        if(exists){
            updateMaterialPlan(reqDTO);
        } else {
            createMaterialPlan(reqDTO);
        }
    }

    @Override
    public void deleteMaterialPlan(Long id) {
        // 校验存在
        validateMaterialPlanExists(id);
        // 删除
        materialPlanMapper.deleteById(id);
    }

    private void validateMaterialPlanExists(Long id) {
        if (materialPlanMapper.selectById(id) == null) {
            throw exception(MATERIAL_PLAN_NOT_EXISTS);
        }
    }

    @Override
    public ErpMaterialPlanDO getMaterialPlanByMaterialId(Long materialId) {
        return materialPlanMapper.selectOne(
                Wrappers.lambdaQuery(ErpMaterialPlanDO.class)
                        .eq(ErpMaterialPlanDO::getMaterialId, materialId)
                        .eq(ErpMaterialPlanDO::getDeleted, Boolean.FALSE)
        );
    }

    @Override
    public PageResult<ErpMaterialPlanDO> getMaterialPlanPage(ErpMaterialPlanPageReqDTO pageReqDTO) {
        return materialPlanMapper.selectPage(pageReqDTO, new LambdaQueryWrapperX<ErpMaterialPlanDO>()
                .eqIfPresent(ErpMaterialPlanDO::getStatus, pageReqDTO.getStatus())
                .eqIfPresent(ErpMaterialPlanDO::getFreezeOrgUnit, pageReqDTO.getFreezeOrgUnit())
                .eqIfPresent(ErpMaterialPlanDO::getMaterialId, pageReqDTO.getMaterialId())
                .eqIfPresent(ErpMaterialPlanDO::getMaterialAttr, pageReqDTO.getMaterialAttr())
                .eqIfPresent(ErpMaterialPlanDO::getPlanStrategy, pageReqDTO.getPlanStrategy())
                .eqIfPresent(ErpMaterialPlanDO::getMaterialChar, pageReqDTO.getMaterialChar())
                .eqIfPresent(ErpMaterialPlanDO::getBatchincQty, pageReqDTO.getBatchincQty())
                .betweenIfPresent(ErpMaterialPlanDO::getProduceLeadTime, pageReqDTO.getProduceLeadTime())
                .betweenIfPresent(ErpMaterialPlanDO::getRecevingLeadTime, pageReqDTO.getRecevingLeadTime())
                .eqIfPresent(ErpMaterialPlanDO::getDutyDepartmentId, pageReqDTO.getDutyDepartmentId())
                .eqIfPresent(ErpMaterialPlanDO::getIsBackFlush, pageReqDTO.getIsBackFlush())
                .eqIfPresent(ErpMaterialPlanDO::getIssMode, pageReqDTO.getIssMode())
                .betweenIfPresent(ErpMaterialPlanDO::getIssLeadTime, pageReqDTO.getIssLeadTime())
                .eqIfPresent(ErpMaterialPlanDO::getPlanningMode, pageReqDTO.getPlanningMode())
                .eqIfPresent(ErpMaterialPlanDO::getIsKeyPart, pageReqDTO.getIsKeyPart())
                .eqIfPresent(ErpMaterialPlanDO::getQualityOrgId, pageReqDTO.getQualityOrgId())
                .eqIfPresent(ErpMaterialPlanDO::getProductLineId, pageReqDTO.getProductLineId())
                .eqIfPresent(ErpMaterialPlanDO::getPurOrgId, pageReqDTO.getPurOrgId())
                .betweenIfPresent(ErpMaterialPlanDO::getCreateTime, pageReqDTO.getCreateTime())
                .orderByDesc(ErpMaterialPlanDO::getId));
    }

    @Override
    public List<ErpMaterialPlanRespVO> getErpMaterialPlanListByMaterialId(Collection<Long> ids) {
            List<ErpMaterialPlanDO> result = materialPlanMapper.selectList(ErpMaterialPlanDO::getMaterialId, ids);
            // 物料属性
//            List<DictDataDO> list =
//                    dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), DictTypeConstants.ERP_MATERIAL_ATTR);
//            Map<Integer, DictDataDO> materialAttrMap =  convertMap(list, DictDataDO::getValueInteger);

            return BeanUtils.toBean(result, ErpMaterialPlanRespVO.class
//                    , planInfoRespVO ->{
//                MapUtils.findAndThen(materialAttrMap, planInfoRespVO.getMaterialAttr(), dictDataDO -> planInfoRespVO.setMaterialAttrName(dictDataDO.getLabel()));
//            }
            );

    }

    @Override
    public List<ErpMaterialPlanDO> getErpMaterialPlanInfo(Collection<Long> materialIds) {
        List<ErpMaterialPlanDO> list = materialPlanMapper.selectList(ErpMaterialPlanDO::getMaterialId, materialIds);
        return CollUtil.isEmpty(list) ? Collections.emptyList() : list;
    }
}
